package com.rabbit.mq.enums;

import lombok.AllArgsConstructor;
import lombok.Getter;

import java.util.*;

@Getter
@AllArgsConstructor
public enum QueueEnum {
    /**
     * 简单模式
     */
    simple_queue("simple_queue", "默认与队列的名称相同，无法指定", true, false, false, null),
    /**
     * 工作模式
     */
    work_queue("work_queue", "默认与队列的名称相同，无法指定", true, false, false, null),
    /**
     * 发布订阅
     */
    publish_subscribe1_queue("publish_subscribe_1_queue", "广播时该值无效", true, false, false, null),
    publish_subscribe2_queue("publish_subscribe_2_queue", "广播时该值无效", true, false, false, null),
    /**
     * 路由
     */
    routing1_queue("routing1_queue", "routing.a", true, false, false, null),
    routing2_queue("routing2_queue", "routing.b", true, false, false, null),
    /**
     * 主题
     */
    topics1_queue("topics1_queue", "routing.#", true, false, false, null),
    topics2_queue("topics2_queue", "routing.b.*", true, false, false, null),
    /**
     * 超时队列---不需要定义RabbitListener方法
     */
    deal_queue("deal_queue", "deal.queue", true, false, false, dealParams()),

    /**
     * 超时接收队列
     */
    reply_queue("reply_queue", "reply.queue", true, false, false, null),

    /**
     * 异步队列
     */
    async_queue("async_queue", "async.queue", true, false, false, null),

    /**
     * 批量队列
     */
    batch_queue("batch_queue", "batch.queue", true, false, false, null),
    ;

    /**队列名称(每个队列的名称应是唯一的) */
    private String name ;
    /*队列路由键(注意匹配，例如:路由键“news"将会匹配到指定路由器下路由键为: [bIog news, * news] 的队列) */
    private String routingKey;
    /*是否为持久队列(该队列将在服务器重启后保留下来) */
    private boolean durable;
    /**是否为排他队列(该队列仅由声明者的队列使用连接) */
    private boolean exclusive;
    /*如果队列为空是否删除(如果服务器在不再使用队列时是否删除队列) */
    private boolean autoDelete;
    /*queue的参数*/
    private Map<String, Object> arguments;

    public static List<QueueEnum> toList() {
        return new ArrayList<>(Arrays.asList(QueueEnum.values()));
    }

    public static Map<String, Object> dealParams(){
        // reply_to 队列
        Map<String,Object> map = new HashMap<>();
        //设置消息的过期时间 单位毫秒
        map.put("x-message-ttl",10000);
        //设置附带的死信交换机
        map.put("x-dead-letter-exchange","reply_exchange");
        //指定重定向的路由建 消息作废之后可以决定需不需要更改他的路由建 如果需要 就在这里指定
        map.put("x-dead-letter-routing-key","reply.queue");
        return map;
    }
}
